package com.linkhub.oms.component.redis.locker;

import org.redisson.api.RLock;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Description: DistributedLocker
 * @Author: echo
 * @Date: 2024/3/3 11:29
 * @Version: 1.0
 */
public interface DistributedLocker {

    /**
     * 阻塞性地获取分布式锁，不自动释放锁
     *
     * @param lockKey 锁的键值
     * @return 锁
     */
    RLock lock(String lockKey);

    /**
     * 阻塞性地获取分布式锁，持有锁指定时间后释放锁
     *
     * @param lockKey 锁的键值
     * @param timeout 持有锁的秒数
     * @return 锁
     */
    RLock lock(String lockKey, int timeout);

    /**
     * 阻塞性地获取分布式锁，持有锁指定时间后释放锁
     *
     * @param lockKey 锁的键值
     * @param timeout 持有锁的时间
     * @param unit    时间单位
     * @return 锁
     */
    RLock lock(String lockKey, int timeout, TimeUnit unit);

    /**
     * 非阻塞性地获取分布式锁，不自动释放锁
     *
     * @param lockKey 锁的键值
     * @return true：获取锁成功，false：获取锁失败
     */
    boolean tryLock(String lockKey);

    /**
     * 非阻塞性地获取分布式锁，持有锁指定时间后释放锁
     *
     * @param lockKey   锁的键值
     * @param waitTime  等待锁的时间
     * @param leaseTime 持有锁的时间
     * @param unit      时间单位
     * @return true：获取锁成功，false：获取锁失败
     */
    boolean tryLock(String lockKey, int waitTime, int leaseTime, TimeUnit unit);

    List<String> tryWmsLock( Map<String, String> lockKeysMap );

    List<String> tryLock( Map<String, String> lockKeysMap, int releaseTime );

    /**
     * 释放分布式锁
     *
     * @param lockKey 锁的键值
     */
    void unlock(String lockKey);

    /**
     * 释放分布式锁
     *
     * @param lock 锁对象
     */
    void unlock(RLock lock);

    /**
     * 联合锁
     *
     * @param lockKeys 锁的键值s
     * @return RLock
     */
    RLock multiLock(List<String> lockKeys);

    /**
     * 联合锁，持有锁指定时间后释放锁
     *
     * @param lockKeys 锁的键值
     * @param timeout 持有锁的秒数
     * @return 锁
     */
    RLock multiLock(List<String> lockKeys, int timeout);


    /**
     * 联合锁，持有锁指定时间后释放锁
     *
     * @param lockKeys 锁的键值
     * @param timeout 持有锁的秒数
     * @return 锁
     */
    RLock multiLock(List<String> lockKeys, int timeout, TimeUnit unit);


    /**
     * 获取联合锁
     *
     * @param lockKeys 锁的键值s
     * @return true：获取锁成功，false：获取锁失败
     */
    boolean tryLockMulti(List<String> lockKeys);

    /**
     * 获取联合锁
     *
     * @param lockKeys   锁的键值
     * @param waitTime  等待锁的时间
     * @param leaseTime 持有锁的时间
     * @param unit      时间单位
     * @return true：获取锁成功，false：获取锁失败
     */
    boolean tryLockMulti(List<String> lockKeys, int waitTime, int leaseTime, TimeUnit unit);


    /**
     * 释放联合锁锁
     *
     * @param lockKeys 锁的键值
     */
    void unLockMulti(List<String> lockKeys);

}
